package com.gitee.zhanyao.codebase.java.reflect.reflect;

import java.io.Serializable;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Method;
import java.util.function.Function;

/**
 * @author zhanyao
 */
@FunctionalInterface
public interface ReflectFunction<T, R> extends Serializable, Function<T, R> {

    static <T> String getMethodName(Serializable lambda) {
        // isSynthetic 返回值代表对象是否是一个自动生成的类，lambda、匿名内部类都属于自动生成的类；
        if (!lambda.getClass().isSynthetic()) {
            throw new RuntimeException("该方法仅能传入 lambda 表达式产生的合成类");
        }
        try {
            Method method = lambda.getClass().getDeclaredMethod("writeReplace");
            // 成员变量为 private,故必须进行此操作
            method.setAccessible(Boolean.TRUE);
            SerializedLambda serializedLambda = (SerializedLambda) method.invoke(lambda);
            return serializedLambda.getImplMethodName();
        } catch (ReflectiveOperationException e) {
            throw new RuntimeException(e);
        }
    }

}
